const fs = require('fs');
const path = require('path');

// 房东 先将房子 挂载中介上
// 发布订阅的好处 可以解耦和

let school = {}; // vue eventBus
let event = {
    arr:[], // 中介
    on(fn){
        this.arr.push(fn); // 把函数存到数组中
    },
    emit(){
        this.arr.forEach(fn=>fn()); // 发布
    }
}
event.on(function(){
    console.log('读取一次')
})
event.on(function(){
    // 订阅 ['name',age]
    if(Object.keys(school).length === 2){
        console.log(school);
    }
})

fs.readFile(path.resolve(__dirname,'./name.txt'),'utf8',function(err,data){
    school['name'] = data;
    event.emit(); // 发布
})
fs.readFile(path.resolve(__dirname,'./age.txt'),'utf8',function(err,data){
    school['age'] = data;
    event.emit(); // 发布
})

// 发布订阅 和 观察者模式的区别(基于发布订阅的) vue 观察者模式
// 发布订阅 发布和订阅没有直接关系(观察者模式则有)
// 观察者模式 被观察的 和 观察者，把观察者 放到 被观察者中，被观察者会主动通知观察者(将自己的状态告诉被观察者)
